package com.guanzhi.AES;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

/**
 * 小工具
 * <p> Package: com.guanzhi.AES </p>
 * <p> File: GenerateAesUtil.java </p>
 * <p> Description:  (AES 密钥/盐值生成)</p>
 * <p> Date: 2024/2/21 14:51</p>
 *
 * @author 观之
 * @version 1.0 （代码版本）
 * @email <a href="mailto:guanzhi55634@aliyun.com">观之</a>（邮箱）
 * @date 2024/2/21 14:51
 * @since jdk17（jdk版本）
 */
public class GenerateAesUtil {
    /**
     * AES 中的 IV 必须是 16 字节（128位）长
     */
    private static final Integer IV_LENGTH = 16;

    /**
     * 字符
     */
    private static final String CHARACTER = "!@#$%^&*()_+|1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";

    /**
     * <h2>获取盐值</h2>
     * <h2>初始化向量（IV），它是一个随机生成的字节数组，用于增加加密和解密的安全性</h2>
     */
    public static String generateIV() {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < IV_LENGTH; i++) {
            int number = random.nextInt(CHARACTER.length());
            sb.append(CHARACTER.charAt(number));
        }
        return sb.toString();
    }

    /***
     * <h2>获取密钥</h2>
     * @param keyLength 密钥长度 128, 192, 256
     * @return 密钥
     */
    public static String generateKey(int keyLength) {
        try {
            // 获取AES算法的KeyGenerator实例
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            //下面调用方法的参数决定了生成密钥的长度，可以修改为128, 192或256
            keyGenerator.init(keyLength);
            // 生成密钥
            SecretKey secretKey = keyGenerator.generateKey();
            // 输出密钥（通常密钥是二进制数据，这里转换为字节数组展示）
            byte[] keyBytes = secretKey.getEncoded();
            //返回密钥
            //TODO 编码后会增加了几个字符，导致256位密钥会变成44位长度,存在问题
            //return new String(keyBytes, StandardCharsets.UTF_8);
            return Base64.encodeBase64String(keyBytes);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {

    }
}
